package com.itheima.controller;

import com.itheima.health.pojo.Permission;
import com.itheima.health.pojo.Role;
import com.itheima.health.pojo.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 这是一个用于提供认证授权服务的类 实现UserDetailsService
 * 这里要关联dao 查询用户的数据，并赋予权限
 * 把这个类交给spring管理 这样才能注入service层
 */
@Component
public class SpringSecurityUserService implements UserDetailsService {
    //注入UserService
    @Autowired
    private UserService us;


    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        System.out.println("进入方法");

        //查询数据库
        User user = us.findUserByUsername(s);

        //判断这个用户名是否存在
       if(user==null){
           return null;
       }

       //如果找到了 在这里构建权限集合
        List<GrantedAuthority> list = new ArrayList<>();

       //把用户的权限拿出来装到集合中
        //得到用户的所有角色集合
        Set<Role> roles = user.getRoles();
        //遍历用户所有角色
        for (Role role : roles) {
            //得到用户每一个角色身上的权限信息
            Set<Permission> permissions = role.getPermissions();
            //遍历每一种权限
            for (Permission permission : permissions) {
                //把遍历到的权限都装到集合中去
              list.add( new SimpleGrantedAuthority(permission.getKeyword()));
            }
        }
        /*
               返回用户的用户名，密码，和权限集合
         */
        return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),list);
    }
}
